Snowflakeダイナミックデータマスキングを'IS_DATABASE_ROLE_IN_SESSION()'で制御する

Snowflakeダイナミックデータマスキングを'IS_DATABASE_ROLE_IN_SESSION()'で制御する

Clock Icon2024.09.12

データ事業本部の荒木です。

Snowflakeのダイナミックデータマスキングを使った際にマスキングするしないをロールによって制御するかと思います。

マスキングされたデータを表示させたいロールが増えた際に簡単にマスキングを適用させる方法でIS_DATABASE_ROLE_IN_SESSION()を使った方法を紹介したいと思います。

本題

コンテキスト関数CURRENT_ROLE()について

まずダイナミックデータマスキングの条件設定で、公式ページにもある以下のようなコンテキスト関数のCURRENT_ROLE()を使う方法があります。

CREATE OR REPLACE MASKING POLICY mask_string AS (val string) RETURNS string ->
CASE
  WHEN CURRENT_ROLE() IN ('ROLE_A') THEN val
  ELSE '********'
END;

CURRENT_ROLEは「現在のセッションで使用中のロールが返却される」ため、上記のようにロールAをマスキング条件に設定するとロールAをセッションで使用しているときにマスキングされていないデータを表示することができるようになります。

上記の場合マスキングしていないデータを表示するロールが増えるたびにマスキングポリシーの設定を変更する必要があります。

CREATE OR REPLACE MASKING POLICY MASK_STRING AS (VAL STRING) RETURNS STRING ->
CASE
  WHEN CURRENT_ROLE() IN ('ROLE_A','ROLE_B','ROLE_C') THEN VAL
  ELSE '********'
END;

追加する分には問題ないですが、設定変更の際に間違ってロールが削除されていたとなると情報漏洩にもなってしまいます。

コンテキスト関数IS_ROLE_IN_SESSION()について

マスキング対象のデータの表示有無をロールで制御する際に、対象となるロールが増減する場合には、コンテキスト関数のIS_ROLE_IN_SESSION()を使用するのがいいかと思います。

IS_ROLE_IN_SESSION()は「セッション内のユーザーの現在のロール(つまり、 CURRENT_ROLE によって返されるロール)が指定されたロールの権限を継承しているかを判定」することができます。

つまりこれら使用するとIS_ROLE_IN_SESSION()で指定したアカウントロールを継承していれば、マスキングされてないデータを表示するなどの制御をすることができます。

コンテキスト関数IS_DATABASE_ROLE_IN_SESSION()について

今回はIS_ROLE_IN_SESSION()ではなく、IS_DATABASE_ROLE_IN_SESSION()を使いました。

IS_ROLE_IN_SESSION()は指定したアカウントロールが継承されているかを判定できるのに対し、IS_DATABASE_ROLE_IN_SESSION()は指定したデータベースロールが継承されているかを判定することができます。

今回IS_DATABASE_ROLE_IN_SESSION()を使ってみようと思ったのは以下の理由です。

  • マスキングポリシーの条件設定に追加するロールを、マスキング条件の対象となるロールに継承することでマスキングの制御をしたい
  • マスキングポリシーの条件設定に追加するロールは、特に権限付与はせずマスキング条件の対象となるロールにフラグとして継承するだけなので、Snowsightのロールグラフやセッションロール一覧に表示されない方がよかった

後は単にデータベースロールの使い道を模索してました。。

作成したマスキングポリシーは以下のようなポリシーで、IS_DATABASE_ROLE_IN_SESSION()NO_MASKING_DATA_DATABASE_ROLEを指定することでこのデータベースロールが継承されているロールはマスキングされていないデータを表示することができるようになります。

CREATE MASKING POLICY VARCHAR_MASKING AS (VAL STRING) RETURNS STRING ->
  CASE
     WHEN IS_DATABASE_ROLE_IN_SESSION('NO_MASKING_DATA_DATABASE_ROLE') THEN VAL
     ELSE '*********'
  END;

マスキングされていないデータを表示させたいロールが複数あれば、マスキングポリシーの設定を変更せずこのデータベースロールをアカウントロールに継承するだけでマスキングされていないデータを表示させることができます。

まとめ

IS_ROLE_IN_SESSIONIS_DATABASE_ROLE_IN_SESSIONを使用した場合、指定したロールを直接継承していロールだけでなく階層構造で継承される全てのロールにマスキング設定が適用されます。

そのため意図していないロールに設定が反映されないようにロールの設計をする必要があるかと思います。

Snowflakeのロール設計については以下の記事も参考にしていただければと思います。
https://dev.classmethod.jp/articles/snowflake_role_design/

参照

Snowflake公式ドキュメント

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.